x86/setup: correct register clobbers for the asm statement when resyncing the stack
authorAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 23 Oct 2014 08:18:29 +0000 (10:18 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 23 Oct 2014 08:18:29 +0000 (10:18 +0200)
When resyncing the stack, the asm statement does not identify %rsi, %rdi and
%rcx as clobbered by the 'rep movsq'.

Luckily, there are no functional problems in the generated code.  GCC decides
not to save any of them before calling boostrap_map(), which clobbers them.

Correct the clobbers, by listing them as earlyclobber discarded outputs.

Reported-by: Daniel Kiper <daniel.kiper@oracle.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Tested-by: Daniel Kiper <daniel.kiper@oracle.com>
xen/arch/x86/setup.c

index bfbb310afbc4ae3571205e62ad10f224de36d4ab..73e95c69a73166b8f0da8e2ad4fd07a3bb993702 100644 (file)
@@ -902,11 +902,13 @@ void __init noreturn __start_xen(unsigned long mbi_p)
                 "movq %%cr4,%%rsi ; "
                 "andb $0x7f,%%sil ; "
                 "movq %%rsi,%%cr4 ; " /* CR4.PGE == 0 */
-                "movq %0,%%cr3    ; " /* CR3 == new pagetables */
+                "movq %[pg],%%cr3 ; " /* CR3 == new pagetables */
                 "orb $0x80,%%sil  ; "
                 "movq %%rsi,%%cr4   " /* CR4.PGE == 1 */
-                : : "r" (__pa(idle_pg_table)), "S" (cpu0_stack),
-                "D" (__va(__pa(cpu0_stack))), "c" (STACK_SIZE / 8) : "memory" );
+                : "=&S" (i), "=&D" (i), "=&c" (i) /* All outputs discarded. */
+                :  [pg] "r" (__pa(idle_pg_table)), "0" (cpu0_stack),
+                   "1" (__va(__pa(cpu0_stack))), "2" (STACK_SIZE / 8)
+                : "memory" );
 
             bootstrap_map(NULL);
         }